#ifndef _DEFS_H_
#define _DEFS_H_

#include "types.h"
#include "mmu.h"
#include "spinlock.h"

//字符串操作
void* memset(void*, int, uint64);
void* memmove(void*, const void*, uint64);
void* memcpy(void*, const void*, uint64);

// 控制台输出
void printf(const char* fmt, ...);
void cprintf(const char* fmt, ...); // 可能带颜色的控制台输出
void panic(const char*) __attribute__((noreturn)); // 内核恐慌

// 内存操作宏
#define PGROUNDUP(sz)  (((sz)+PAGE_SIZE-1) & ~(PAGE_SIZE-1))
#define PGROUNDDOWN(a) (((a)) & ~(PAGE_SIZE-1))

// 物理内存管理
void pmm_init(void);
void* alloc_page(void);
void free_page(void*);
void* alloc_pages(int n);
void pmm_stats(void);

// 虚拟内存管理
pagetable_t create_pagetable(void);
void free_pagetable(pagetable_t,int);
int map_page(pagetable_t, uint64, uint64,int);
pte_t* walk_lookup(pagetable_t,uint64);
void dump_pagetable(pagetable_t, int);

// 内核初始化
void kvminit(void);      // 初始化内核页表
void kvminithart(void);  // 启用内核页表

// 外部符号声明
extern char end[];
extern char etext[];

#endif // _DEFS_H_